#ifndef __HTABLE__
#define __HTABLE__

#include <string>
using namespace std;

const int ISIZE=1<<3;
const int SPINT= 0xffffffff >> 1;
// open addressing
// to store string list
class htable{
	static int hashfunc(int);

private:
	int initsize;
	int p[ISIZE];

	int _search(int hx, int y){
		int tmp=hx;
		while (p[hx]!=y){
			hx++;
			if (hx>ISIZE-1){
				hx=0;
			}
			if (tmp==hx){
				return -1;
			}
		}
		return hx;
	}
public:
	bool add(int x){
		int i = htable::hashfunc(x);
		int j=i;
		while(p[i] != SPINT){
			++i;
			if (i>ISIZE-1){
				i=0;	
			}
			if (j==i){
				return false;//need to add space
			}
		}
		p[i] = x;
		return true;
	}

	int get(int y){
		return _search(htable::hashfunc(y),y);
	}

	htable():
	initsize(ISIZE)
	{
		for (int i=0;i<ISIZE;++i){
			p[i] = SPINT;
		}
	}
};

int htable::hashfunc(int lhs){
	return lhs%ISIZE;
}


void test_hashtable(){
	htable h;

	h.add(12795);
	h.add(121);
	h.add(1223);
	h.add(791);
	h.add(1);
	h.add(79);
	h.add(98);
	h.add(149);

	h.add(4991);
	h.add(12);
	h.add(9791);

	h.get(121);
	cout << h.get(149) << endl;
	cout << h.get(1492) << endl;
}



#endif